public class Test {
    public static void main(String[] args) throws Exception {
        WeatherStation station = new WeatherStation();
        station.addObserver(new PhoneApp());
        station.addObserver(new WebDashboard());
        station.setTemperature(26.5f); // 一次更新，两处推送
        station.setTemperature(30.0f);
    }
}

// 定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
// 观察者模式（Observer）又称发布-订阅模式（Publish-Subscribe：Pub/Sub）。
// 它是一种通知机制，让发送通知的一方（被观察方）和接收通知的一方（观察者）能彼此分离，互不影响。
/* ---------- 抽象层 ---------- */
interface Observer {
    void update(float temperature);
}

interface Subject {
    void addObserver(Observer o);

    void removeObserver(Observer o);

    void notifyObservers();
}

/* ---------- 具体主题 ---------- */
class WeatherStation implements Subject {
    private final java.util.List<Observer> observers = new java.util.ArrayList<>();
    private float temperature;

    void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers(); // 状态一变立刻广播
    }

    public void addObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    public void notifyObservers() {
        for (Observer o : observers)
            o.update(temperature);
    }
}

/* ---------- 具体观察者 ---------- */
class PhoneApp implements Observer {
    public void update(float temperature) {
        System.out.println("📱 手机推送：当前气温 " + temperature + "℃");
    }
}

class WebDashboard implements Observer {
    public void update(float temperature) {
        System.out.println("🌐 网页仪表板：气温已更新为 " + temperature + "℃");
    }
}